package code19_jdk8.opt;

import java.util.Optional;

public class Test01 {

	public static void main(String[] args) {
		Integer m1 = null;
		Integer m2 = 10;
		
		// 创建 Optional 对象
		// ofNullable 允许参数为null, 可以存储 null值
		Optional<Integer> a = Optional.ofNullable(m1);
		//System.out.println(a);
		
		// empty 创建一个 存储 null 的Optional 对象
		Optional<Integer> b = Optional.empty();
		
		// of 不能存入 null
		Optional<Integer> c = Optional.of(m2);
		//System.out.println(c);
		
		
		Integer sum = sum(a, c);
		System.out.println("sum:" + sum);
	}
	
	public static Integer sum(Optional<Integer> o1, Optional<Integer> o2) {
		// 判断 Optional中的值是否存在
		System.out.println("第一参数:"+o1.isPresent());
		System.out.println("第二参数:"+o2.isPresent());
		
		// 值存在, 才能 通过 get 获取
		//Integer m1 = o1.get();
		Integer m2 = o2.get();
		
		// orElse 如果 o1 值存在(会执行 orElse 参数中的代码), 则返回它, 否则返回 orElse后的 值
		Integer m1 = o1.orElse( new Integer(0) );// orElse 的参数相当于 默认值
		//System.out.println("orElse:"+m1);
		
		// orElseGet 如果 o1 值存在(不会执行 orElseGet 参数中的代码), 则返回它, 否则返回 orElseGet 会返回 Supplier 返回的值
		m1 = o1.orElseGet( () -> new Integer(0) );
		//System.out.println("orElseGet:"+m1);
		
		// orElseThrow 如果 o1 值存在, 则返回它, 否则返回  Supplier 提供的异常对象
		//m1 = o1.orElseThrow( () -> new IllegalArgumentException("o1 存储的值不能为null") );
		
		// 转换
		// 把 Integer 转为 16进制的String, 会把转换后的结果再封装为 Optional
		Optional<String> map = o2.map( i -> Integer.toHexString(i) );
		System.out.println("map:" + map);
		// 把 Integer 转为 16进制的String, 需要自己手动把结果 封装为  Optional
		Optional<String> flatMap = o2.flatMap(i -> {
			String str = Integer.toHexString(i);
			Optional<String> op = Optional.of(str);
			return op;
		} );
		System.out.println("flatMap:" + flatMap);
		
		// 过滤: predicate 结果为true, 返回原来的Optional, 结果为false, 返回 一个空的 Optional
		Optional<Integer> filter = o2.filter( i -> i < 20 );
		System.out.println("filter:" + filter);
		
		return m1 + m2;
	}
	
}
